#!/usr/bin/perl

package ResultadosDetallados;
use Exporter;
use warnings;
@ISA = ('Exporter');
@EXPORT = ('pedirFiltrosParaConsultaDetallada');

#==============================================================================
sub pedirFiltrosParaConsultaDetallada {
    ($guardarResultado) = @_;

    # ---- filtros por sistemas -----------------------------------------------
    print "\e[1;32m=== ELECCION DE CRITERIO DE FILTRADO ===\e[0m\n";
    print "(decida que criterio desea usar para filtrar los resultados)\n\n";
    %opcionesFiltrado = ('1' => 'Por patron', '2' => 'Por ciclo', '3' => 'Por archivo');
    main::mostrarLista(%opcionesFiltrado);
    $tipoFiltrado = 0;
    while (!(exists($opcionesFiltrado{$tipoFiltrado}))) {
        $tipoFiltrado = main::pedirNumero("Ingrese 1, 2 o 3:");
    }
    
    print "\n";
    if ($tipoFiltrado eq '1') {
        pedirDatosParaConsultaPorPatron($guardarResultado);
    } elsif ($tipoFiltrado eq '2') {
        pedirDatosParaConsultaPorCiclo($guardarResultado);
    } elsif ($tipoFiltrado eq '3') {
        pedirDatosParaConsultaPorArchivo($guardarResultado);
    }
}

#==============================================================================
sub pedirDatosParaConsultaPorArchivo {
    ($guardarResultado) = @_;
   
    %config = main::leerConfiguracion();
   
    print "\e[1;32m=== ELECCION DE ARCHIVO ===\e[0m\n";
    $archivo = main::pedirCadena("Ingrese el nombre de archivo:");
    
    %todosLosPatrones = main::leerArchivoDePatrones();
    %patrones = ();
    @archivosDeResultados = main::obtenerRutasDeArchivosDeResultadosDetallados();
    foreach (@archivosDeResultados) {
        open(ARCHIVO, "<$_");
        @partesRuta = split('\.', $_);
        $numeroPatron = $partesRuta[@partesRuta - 1];
        
        while ($linea = <ARCHIVO>) {
            @datosLinea = split('\+-#-\+', $linea);
            if ($datosLinea[1] eq $archivo) {
                $patrones{$numeroPatron} = "Patron $todosLosPatrones{$numeroPatron}";
            }
        }
        close(ARCHIVO);
    }
    
    if (keys %patrones == 0) {
        print "No hay ningun resultado para ese archivo\n";
        return;
    }
    
    @opcionesElegidas = ();
    print "\n";
    print "\e[1;32m=== ELECCION DE FILTRO POR PATRONES ===\e[0m\n";
    main::mostrarLista(%patrones);
    $opcion = 0;
    while ($opcion ne '') {
        $opcion = main::pedirNumero("Ingrese numero de patron:");
        if (exists($patrones{$opcion})) {
            push(@opcionesElegidas, $opcion);
        } elsif ($opcion ne '') {
            print "Ingrese una opcion valida\n";
        }
    }
    
    print "\n\n";
    print "\e[1;33m=== RESULTADOS DE LA CONSULTA ===\e[0m\n";
    
    main::emitirLineaDeSalida("Reporte de resultados detallados para el archivo $archivo\n", $guardarResultado);
    $total = 0;
    foreach (@archivosDeResultados) {
        open(ARCHIVO, "<$_");
        @partesRuta = split('\.', $_);
        $numeroPatron = $partesRuta[@partesRuta - 1];
        
        while ($linea = <ARCHIVO>) {
            @datosLinea = split('\+-#-\+', $linea);
            foreach (@opcionesElegidas) {
                if ($_ eq $numeroPatron && $archivo eq $datosLinea[1]) {
                    chomp($datosLinea[3]);
                    main::emitirLineaDeSalida("Numero de registro: $datosLinea[2] - Coincidencia: $datosLinea[3]", $guardarResultado);
                    $total++;
                }
            }
        }
    }
    
    main::emitirLineaDeSalida("El total de resultados es $total", $guardarResultado);
    
    if ($guardarResultado) {
        print "\n\e[1;32mSe ha guardado el reporte de la consulta en " . $main::rutaDeReporte . "\e[0m\n";
    }
}

#==============================================================================
sub pedirDatosParaConsultaPorCiclo {
    ($guardarResultado) = @_;
   
    %config = main::leerConfiguracion();
   
    print "\e[1;32m=== ELECCION DE CICLO ===\e[0m\n";
    $ciclo = main::pedirNumero("Ingrese el numero de ciclo:");
    
    %todosLosPatrones = main::leerArchivoDePatrones();
    %patronesYArchivos = ();
    @archivosDeResultados = main::obtenerRutasDeArchivosDeResultadosDetallados();
    foreach (@archivosDeResultados) {
        open(ARCHIVO, "<$_");
        @partesRuta = split('\.', $_);
        $numeroPatron = $partesRuta[@partesRuta - 1];
        
        while ($linea = <ARCHIVO>) {
            @datosLinea = split('\+-#-\+', $linea);
            if ($datosLinea[0] eq $ciclo) {
                $nombreArchivo = $datosLinea[1];
                $patronesYArchivos{$numeroPatron . "," . $nombreArchivo} = "Patron $todosLosPatrones{$numeroPatron} - Archivo $nombreArchivo";
            }
        }
        
        close(ARCHIVO);
    }
    
    @opcionesElegidas = ();
    print "\n";
    print "\e[1;32m=== ELECCION DE FILTRO POR PATRONES Y ARCHIVOS ===\e[0m\n";
    main::mostrarLista(%patronesYArchivos);
    $opcion = 0;
    while ($opcion ne '') {
        $opcion = main::pedirCadena("Ingrese numero de patron y nombre de archivo (separados por una coma, como se muestran en la lista):");
        if (exists($patronesYArchivos{$opcion})) {
            push(@opcionesElegidas, $opcion);
        } elsif ($opcion ne '') {
            print "Ingrese una opcion valida\n";
        }
    }
    
    print "\n\n";
    print "\e[1;33m=== RESULTADOS DE LA CONSULTA ===\e[0m\n";
    
    main::emitirLineaDeSalida("Reporte de resultados detallados para el ciclo $ciclo\n", $guardarResultado);
    $total = 0;
    foreach (@archivosDeResultados) {
        open(ARCHIVO, "<$_");
        @partesRuta = split('\.', $_);
        $numeroPatron = $partesRuta[@partesRuta - 1];
        
        while ($linea = <ARCHIVO>) {
            @datosLinea = split('\+-#-\+', $linea);
            foreach (@opcionesElegidas) {
                @datosOpciones = split(',', $_);
                if ($datosOpciones[0] eq $numeroPatron && $datosLinea[1] eq $datosOpciones[1] && $ciclo eq $datosLinea[0]) {
                    chomp($datosLinea[3]);
                    main::emitirLineaDeSalida("Numero de registro: $datosLinea[2] - Coincidencia: $datosLinea[3]", $guardarResultado);
                    $total++;
                }
            }
        }
    }
    
    main::emitirLineaDeSalida("El total de resultados es $total", $guardarResultado);
    
    if ($guardarResultado) {
        print "\n\e[1;32mSe ha guardado el reporte de la consulta en " . $main::rutaDeReporte . "\e[0m\n";
    }
}

#==============================================================================
sub pedirDatosParaConsultaPorPatron {
    ($guardarResultado) = @_;
   
    %config = main::leerConfiguracion();
   
    print "\e[1;32m=== ELECCION DE PATRON ===\e[0m\n";
    %todosLosPatrones = main::leerArchivoDePatrones();
    main::mostrarLista(%todosLosPatrones);
    $patron = 0;
    while (!(exists($todosLosPatrones{$patron}))) {
        $patron = main::pedirNumero("Ingrese numero de patron:");
        if (!exists($todosLosPatrones{$patron})) {
            print "Ingrese un numero de patron valido\n";
        }
    }
   
    @directorioGlobeado = glob($config{'PROCDIR'});
    $ruta = $directorioGlobeado[0] . '/resultados.' . $patron;
    if (!(-f $ruta)) {
        print "No hay ningun resultado para ese patron\n";
        return;
    }
    
    open(ARCHIVO, "<$ruta");
    
    %ciclosYArchivos = ();
    while ($linea = <ARCHIVO>) {
        @datosLinea = split('\+-#-\+', $linea);
        $ciclosYArchivos{$datosLinea[0] . "," . $datosLinea[1]} = "Ciclo $datosLinea[0] - Archivo $datosLinea[1]";
    }
    
    @opcionesElegidas = ();
    print "\n";
    print "\e[1;32m=== ELECCION DE FILTRO POR CICLOS Y ARCHIVOS ===\e[0m\n";
    main::mostrarLista(%ciclosYArchivos);
    $opcion = 0;
    while ($opcion ne '') {
        $opcion = main::pedirCadena("Ingrese numero de ciclo y nombre de archivo (separados por una coma, como se muestran en la lista):");
        if (exists($ciclosYArchivos{$opcion})) {
            push(@opcionesElegidas, $opcion);
        } elsif ($opcion ne '') {
            print "Ingrese una opcion valida\n";
        }
    }
    
    print "\n\n";
    print "\e[1;33m=== RESULTADOS DE LA CONSULTA ===\e[0m\n";
    
    main::emitirLineaDeSalida("Reporte de resultados detallados para el patron $todosLosPatrones{$patron}\n", $guardarResultado);
    $total = 0;
    
    seek(ARCHIVO, 0, 0);
    
    while ($linea = <ARCHIVO>) {
        @datosLinea = split('\+-#-\+', $linea);
        foreach (@opcionesElegidas) {
            @datosOpciones = split(',', $_);
            if ($datosLinea[1] eq $datosOpciones[1] && $datosLinea[0] eq $datosOpciones[0]) {
                chomp($datosLinea[3]);
                main::emitirLineaDeSalida("Numero de registro: $datosLinea[2] - Coincidencia: $datosLinea[3]", $guardarResultado);
                $total++;
            }
        }
    }
    
    main::emitirLineaDeSalida("El total de resultados es $total", $guardarResultado);
    
    close(ARCHIVO);
    
    if ($guardarResultado) {
        print "\n\e[1;32mSe ha guardado el reporte de la consulta en " . $main::rutaDeReporte . "\e[0m\n";
    }
}
